feat(client): monitor active firmware updates from the Firmware page - #1021
Draft
rl-block wants to merge 1 commit into
Draft
feat(client): monitor active firmware updates from the Firmware page#1021rl-block wants to merge 1 commit into
rl-block wants to merge 1 commit into
Conversation
This was referenced Sep 4, 2026
🔐 Codex Security Review
Review SummaryOverall Risk: HIGH Findings[HIGH] Automated review incomplete
NotesHuman review is required because the bounded automated review was incomplete. Generated by Codex Security Review | |
rl-block
force-pushed
the
rollout/03a-active-updates-ui
branch
from
September 4, 2026 09:39
2d642aa to
625e4cb
Compare
This was referenced Sep 4, 2026
rl-block
force-pushed
the
rollout/03a-active-updates-ui
branch
from
September 4, 2026 10:10
625e4cb to
5602fc5
Compare
rl-block
force-pushed
the
rollout/03a-active-updates-ui
branch
from
September 4, 2026 10:15
5602fc5 to
2d8783b
Compare
rl-block
force-pushed
the
rollout/03a-active-updates-ui
branch
2 times, most recently
from
September 4, 2026 12:06
33cbc37 to
6fc7846
Compare
Active-update banners, the full-screen update detail with lifecycle actions and the telemetry evidence strip, the miners drill-down and the channel history modal, on the merged contract: rollback is offered while the rollout is still at its pair's current assignment generation and reverses the lineage (restoring the previous version, or clearing the firmware for a first assignment); evidence reads the aggregates with their sample counts and the optional change fields; rollouts are matched to their group by the folded manufacturer/model pair key.
rl-block
force-pushed
the
rollout/03a-active-updates-ui
branch
from
September 8, 2026 03:59
6fc7846 to
ab8fea5
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Reviewable diff: +1293/-3 across 9 files (excludes generated, test, story and fixture files).
Summary
Lets operators watch and steer updates in flight. Every active rollout gets a banner above the Firmware tabs; opening one shows the update's state and stage, the actions available (Continue, Pause / Resume, Cancel remaining, Roll back, Retry failed), review and failure callouts, scope and threshold stats, a progress bar and the telemetry evidence the auto-continue gate saw. A miners modal drills into per-miner phase, IP, version and telemetry with a failed-only filter, and the manage view gains a History button listing a channel's past rollouts with View and Roll back.
Stack. #1014 (merged: API contract) -> #1015 -> #1016 -> #1017 (rollout engine) -> #1018 -> #1019 (client data hook) -> #1020 (Release Channels tab) -> #1021 (this PR) -> #1022 (header pill and activity log) -> #1023 (E2E). Diff is relative to #1020. Upstream context:
Rollout.state,stage,evidenceand per-devicephasesemantics from #1017; therolloutStatusadapter and rollout actions from #1019;Firmware.tsx/ReleaseChannelsTabstructure from #1020. Out of scope: the header pill and activity-feed labels (#1022); E2E (#1023).How it works
Firmware.tsxmountsActiveUpdatesMonitorabove the tabs with the sameuseReleaseChannelsinstance the tab uses. The monitor filters rollouts to active ones and rendersActiveUpdateBanners— one callout per rollout withactiveUpdateSummary("74 of 87 miners updated, 2 failed, Batch 5 of 6") and a tone that escalates when the rollout needs attention (awaiting review, failed miners, paused). The monitor owns the detail modal, the cancel and rollback confirmations, and two request channels:MonitorRequest(the history modal asks it to open a rollout or start a rollback) andonManageChannel(the detail modal's Manage action deep-links into the channels tab on that channel).RolloutDetailModalreads everything from theRollout: header with channel, model, target version androlloutStageLabel; an action row whose buttons depend on state (Continue only when awaiting review, Pause/Resume when active, Cancel remaining while anything is queued, Roll back when a previous version exists, Retry failed when failures exist); callouts for failed miners, a review gate with the hold reason, and paused; stats (scope summary, method and pacing, thresholds, target version);CompositionBarprogress fromprogressSegments; and an evidence strip showing hashrate / efficiency / temperature / new-error deltas against baseline with a pass or hold marker per threshold. "View miners" opensRolloutMinersModal, which fetches the rollout's devices through the pagedListRolloutDeviceswhen it opens (and again on each poll while open) and shows a table with phase chip, batch, IP, reported version, attempts, last error and current telemetry, filterable to failed miners.ChannelHistoryModal(from the manage view's History button) lists the channel's rollouts newest first withrolloutOutcomeLabel, model, firmware, progress and started/finished times; View hands off to the monitor's detail modal. "Roll back to " appears on an entry when the assignment that was in place before it differs from the current one, and asks the monitor to confirm and callrollbackFirmwarefor that entry — the server then restores that earlier assignment.Diagrams
flowchart TD F["Firmware.tsx"] --> Mon["ActiveUpdatesMonitor: active rollouts, owns detail + confirmations"] F --> Tab["ReleaseChannelsTab (#1020)"] Mon --> B["ActiveUpdateBanners: one callout per active rollout, activeUpdateSummary"] B --> D["RolloutDetailModal: state, actions, callouts, stats, progress, evidence"] D --> Mi["RolloutMinersModal: per-miner phase, IP, version, attempts, telemetry, failed filter"] D --> Act["continue / pause / resume / cancel / rollback / retryFailed (#1019)"] D --> Manage["Manage -> onManageChannel -> tab opens that channel"] Tab --> Hist["ChannelHistoryModal: past rollouts, View / Roll back"] Hist --> MonsequenceDiagram participant O as Operator participant Mon as ActiveUpdatesMonitor participant H as useReleaseChannels participant S as RolloutService O->>Mon: click banner Mon->>Mon: open RolloutDetailModal(rollout) O->>Mon: Cancel remaining Mon->>O: confirm dialog O->>Mon: confirm Mon->>H: cancelRollout(id) H->>S: CancelRollout H->>S: ListRollouts / ListReleaseChannels (refresh) S-->>H: rollout canceled, updated miners kept H-->>Mon: new rollouts Mon->>O: banner disappears, history shows CanceledAreas of the code involved
.../ReleaseChannels/ActiveUpdatesMonitor.tsx(new)MonitorRequestand manage deep-link plumbing.../ReleaseChannels/ActiveUpdateBanners.tsx(new).../ReleaseChannels/RolloutDetailModal.tsx(new).../ReleaseChannels/RolloutMinersModal.tsx(new)listRolloutDevices.../ReleaseChannels/ChannelHistoryModal.tsx(new)Firmware.tsx,ReleaseChannelsTab.tsx,ReleaseChannelManageView.tsxrolloutStatus.tsactiveUpdateSummary*.stories.tsx(2 new),rolloutStatus.test.tsKey technical decisions & trade-offs
MonitorRequestrather than opening its own detail or rollback dialog, so there is a single place where destructive actions are confirmed.rolloutStatuspredicates so it tracks the domain rules.ReleaseChannelsTabself-contained.Rollout.evidence), not recomputed client-side from device telemetry, so the UI shows exactly what the gate decided on.Contract alignment (after the #1014 merge)
#1014 merged on 2026-09-08 as
74454ed9. This stack was first cut against the contract of 2026-09-04; on 2026-09-08 every PR was rebased ontomainand reworked to the merged contract, so each one is again one commit above its parent and green on its own. Headab8fea567.This PR implements: Active-update banners, update detail with actions and the evidence strip (aggregates with sample counts, optional changes), miners drill-down, channel history: rollback is offered while the rollout is at its pair's current assignment generation and reverses the lineage — restoring the previous version or clearing the firmware for a first assignment.
Implementation notes:
Deferred to follow-up slices (not in this stack): delegated control (
ROLLOUT_METHOD_DELEGATED,AdvanceRollout,SkipRolloutDevices,CompleteRollout,WAITING_FOR_CONTROLLER,controller_timeout_seconds) and the events feed (ListRolloutEvents,RolloutEvent,RolloutActorhistory). The schema, behavior, error reasons, permission entries and enum vocabulary for both are already in place; the handler answers those RPCs withUnimplementedand refuses the DELEGATED method until the slices land.Testing & validation
vitest runforfeatures/settings/components: the newactiveUpdateSummarycase plus the existing suites pass; the twoSchedulePreviewfailures are locale-dependent and identical onmain.tsc --noEmit,eslint --max-warnings 0clean.